package app.controllers;

import app.models.CH;
import app.models.SubEspecialidade;
import app.services.CHService;
import app.services.ConvenioService;
import app.services.EspecialidadeService;
import app.services.SubEspecialidadeService;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.validator.ValidationMessage;

@Resource
public class SubEspecialidadeController {

	private final Result result;
	private final SubEspecialidadeService service;
	private final Validator validator;
	private final EspecialidadeService especialidadeService;
	private final ConvenioService convenioService;
	private final CHService chService;
	
	public SubEspecialidadeController(Result result,
			SubEspecialidadeService service, Validator validator, EspecialidadeService especialidadeService, 
			CHService chService, ConvenioService convenioService) {

		this.result = result;
		this.service = service;
		this.validator = validator;
		this.especialidadeService = especialidadeService;
		this.convenioService = convenioService;
		this.chService = chService;
	}
	
	@Get("/subEspecialidades")
	public void index() {
		this.result.include("subEspecialidades", this.service.findAllOrdered());
		this.result.include("ultimasSubEspecialidades", this.service.findLastSubEspecialidades());
//		this.result.include("CH", this.chService.findLastCH());
	}

	@Get("/subEspecialidades/new")
	public void form() {
		this.result.include("convenios", this.convenioService.findAll());
		this.result.include("especialidades", this.especialidadeService.findAll());
//		this.result.include("CH", this.chService.findLastCH());
	}

	@Get("/subEspecialidades/find")
	public void index(String filter) {
		this.result.include("filter", filter);
		this.result.include("subEspecialidades", this.service.findByFilter(filter));
		
		this.result.of(this).table();
	}
	
	@Post("/subEspecialidades/save")
	public void save(SubEspecialidade subEspecialidade) {
		for(SubEspecialidade e : service.findAllOrdered()){
			if(e.getNome().equals(subEspecialidade.getNome()) && e.getId() != subEspecialidade.getId() ){
				validator.add(new ValidationMessage("Especialidade de Convênio já cadastrada", "erro"));
			}
		}
		
//		CH ch = chService.findByConvenioId(subEspecialidade.getIdConvenio());
		
//		if(ch == null){
//			validator.add(new ValidationMessage("Não existe nenhum CH cadastrado ainda !", "erro"));
//		} else {
//			subEspecialidade.setCh(ch);
//			subEspecialidade.setIdCH(ch.getId().intValue());
//			subEspecialidade.setValor((int) (ch.getValor() * subEspecialidade.getNumeroCH()));
//		}
		
		validator.validate(subEspecialidade);
		validator.onErrorRedirectTo(this).form();
		
		service.create(subEspecialidade);
		
		this.result.redirectTo(this).index();
	}
	
	@Get("/subEspecialidades/{id}/edit")
	public void edit(Long id) {
		this.result.include("convenios", this.convenioService.findAll());
		this.result.include("especialidades", this.especialidadeService.findAll());
		this.result.include("subEspecialidade", service.find(id));
		this.result.include("CH", this.chService.findLastCH());
	}
	
	@Post("/subEspecialidades/update")
	public void update(SubEspecialidade subEspecialidade) {
		for(SubEspecialidade e : service.findAllOrdered()){
			if(e.getNome().equals(subEspecialidade.getNome()) && e.getId() != subEspecialidade.getId() ){
				validator.add(new ValidationMessage("Especialidade de convenio já cadastrada", "erro"));
			}
		}
		
		validator.validate(subEspecialidade);
		
		validator.onErrorRedirectTo(this).edit(subEspecialidade.getId());
		service.update(subEspecialidade);
		
		this.result.redirectTo(this).index();
	}
	
	@Get("/subEspecialidades/{id}/show")
	public void show(Long id) {
		this.result.include("subEspecialidade", service.find(id));
		this.result.include("CH", this.chService.findLastCH());
	}
	
	public void table() {}
	
}
